package org.dromara.hm.domain.bo;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;

/**
 * 提货请求业务对象 (用于接收前端的统一提货请求)
 *
 * @author Hzy
 * @date 2025-07-24
 */
@Data
public class HmPickupRequestBo {

    /**
     * 销售订单ID
     */
    @NotNull(message = "订单ID不能为空")
    private Long orderId;

    /**
     * 提货类型：normal (正常提货), supplementary (补充提货)
     */
    @NotBlank(message = "提货类型不能为空")
    private String type;

    /**
     * 提货项列表
     */
    @NotEmpty(message = "提货项列表不能为空")
    @Valid // 开启对列表内元素的校验
    private List<PickupItemBo> items;

    /**
     * 备注
     */
    private String remark;

    /**
     * 附件列表 (URL)
     */
    private List<String> attachments;

    /**
     * 提货店铺ID (可选，如果未指定，后端可根据操作人或订单店铺获取)
     */
    private Long pickupDeptId;

    /**
     * 补充提货原因 (仅当type为supplementary时需要)
     */
    private String reason;

    /**
     * 证明材料（图片/文档路径），前端文件上传后返回的URL字符串，多个用逗号分隔
     */
    private String proofFiles; // 用于后端存储的字符串形式

    /**
     * 回款方式
     */
    private String method;

    // 内部类：提货项详情
    @Data
    public static class PickupItemBo {
        /**
         * 产品ID (如果是normal，就是原产品ID；如果是supplementary，就是补充产品ID)
         */
        @NotNull(message = "产品ID不能为空")
        private Long productId;

        /**
         * 原始产品ID (仅当外部type为supplementary时需要，表示该补充产品替代的原始产品ID)
         */
        private Long originalProductId;

        /**
         * 数量
         */
        @NotNull(message = "数量不能为空")
        private BigDecimal quantity;

        /**
         * 产品类别：product (商品产品), gift (赠品产品)
         * 这个type是产品自身的类别，与外部的提货type区分
         */
        @NotBlank(message = "产品类别不能为空")
        private String type; // "product" (CP) or "gift" (ZP)
    }
}
